package proyectofinal_diseno;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * @author Katherine Vargas
 * @author Esteban Herrera
 */
public class Programacion_Dinamica 
{
    //Programa de Nutricionista Excentrico
    
    private static final int I = Integer.MAX_VALUE;; // Infinito
 
    static int Min(int a, int b) 
    {
        return (b < a) ? b : a;
    }
 
    private static int[][] Calcular(int[] lista, int N, int C)
    {
        int MaxElem = N + 1;
	int MaxCant = C + 1;
	int[][] tabla = new int[MaxElem][MaxCant];

	for (int i = 0; i < MaxElem; i++)
	{
            tabla[i][0] = 0;
	}
	for (int i = 1; i < MaxCant; i++)
	{
            tabla[0][i] = I;
	}

	int a, b;
	for (int i = 1; i < MaxElem; i++)
	{
            for (int j = 1; j < MaxCant; j++)
            {
                a = tabla[i - 1][j];
		if (lista[i - 1] <= j)
		{
                    b = tabla[i - 1][j - lista[i - 1]];
                    if (b < I)
                    {
                        b += lista[i - 1];
                    }
		}
		else
		{
                    b = lista[i - 1];
		}
		if (b >= j)
		{
                    tabla[i][j] = Min(a, b);
		}
		else
		{
                    tabla[i][j] = I;
		}
            }
	}
		return tabla;
    }

    
    private static int[] Resultado(int[][] t, int[] l, int N, int C)
    {
        java.util.ArrayList<Integer> r = new java.util.ArrayList<>();
	int[] retorno = new int[r.size()];
        for(int index = 0 ; index < r.size() ; index++) 
        {
            retorno[index] = r.get(index);
        }
        return retorno;
    }
    
    private static void Resolver(int[] lista, int C)
    {
        int[][] tabla = Calcular(lista, lista.length, C);
	int[] r = Resultado(tabla, lista, lista.length, C);
        System.out.println("\nMenu de Comidas: \n\n");
        
        for (int i=0; i<lista.length; i++) 
        {
            System.out.println ("\tplato: " + i + "\tCalorias: "+lista[i]);
        }
        System.out.println("\n");
        
	System.out.printf("Total a consumir: %1$s calorías", C, "\n\n");
	//System.out.printf("Total consumido: %1$s calorías", r.Select(x => lista[x]).Sum(), "\r\n");
	System.out.print("\nTotal consumido: "+ r + " calorías\r\n");
        System.exit(0);
	for (int n : r)
	{
            System.out.printf("Calorias -> "+lista[n]+" Plato -> "+n+"\n");
            //System.out.printf("Plato %1$s = %2$s calorías", n + 1, lista[n], "\r\n");
	}
        System.out.println();
    }
 
    static void ejecute (int n)
    {
	int[] lista = {7, 8, 9, 4, 5, 6};
	Resolver(lista, n);
	//Resolver(lista, 37);
	/*
        int[] lista2 = {11, 9, 5, 3};
        Resolver(lista2, 18);
	Resolver(lista2, 15);
	
        int[] lista3 = {8, 16, 24, 32};
	Resolver(lista3, 37);
	Resolver(lista3, 42);*/
    }
    
    
}
